package ModelAndController;
/*
 * A hálózat huzal, vezeték elemeit megvalósító osztály. 
 * Az aktuális belső állapot tárolását, a közvetlenül kapcsolódó 
 * építőelemek nyilvántartását, valamint a huzal megfelelő ütemezését valósítja meg.
 */
//Exception 280 es 299 kozott
public class Wire {
	//A huzal belső állapotát tárolja.
	private int state;
	private int nbOfOutputOnInputElement;
	private String buffer;
	/*
	 * A shouldUpdate() függvénnyel állítható true értékre. 
	 * Az isUpdateSucces() csak akkor végez érdemi műveleteket, 
	 * ha a shouldUpdate true értéket vesz fel.
	 */
	private boolean shouldUpdate;
	private Element inputElement;//Bemeneten lévő elemre tárolt referencia.
	private Element outputElement;//Kimeneten lévő elemre tárolt referencia.
	//konstruktor
	public Wire(){
		state = -1;
		nbOfOutputOnInputElement = 0;
	}
	//Hibát dob,ha nincs bekötve a kimenet,bemenet
	public void check() throws Exception{
		if(inputElement == null)
			throw new Exception("280");
		
		if(outputElement == null)
			throw new Exception("281");
	}
	/*
	 * Az huzal belső állapotának számítását végzi a bemenetek értékének függvényében.
	 *  Ha az adott huzal belső értéke változott, akkor azt jelzi a 
	 *  visszatérési értéken.
	 */
	public boolean isUpdateSuccess() throws Exception{
		boolean retValue = false;
		if(shouldUpdate){
			int inputElementState = inputElement.getState(nbOfOutputOnInputElement);
			if(inputElementState != state){
				retValue = true;
				setNewStateAndNotifyOutputElement(inputElementState);
			}
			shouldUpdate = false;
		}
		buffer = Integer.toString( state );
		return retValue;
	}
	//A huzal bemenetén lévő építőelem referenciáját tárolja el.
	public void setInputElement(Element act){
		inputElement = act;
	}
	// A huzal kimenetén lévő építőelem referenciáját tárolja el.
	public void setOutputElement(Element act){
		outputElement = act;
	}
	public void shouldUpdate(){
		shouldUpdate = true;
	}
	//A huzal belső állapotát adja vissza
	public int getState(){
		return state;
	}
	public void setNbOfOutputOnInputElement(int copy){
		nbOfOutputOnInputElement = copy;
	}
	private void setNewStateAndNotifyOutputElement(int newState){
		state = newState;
		outputElement.shouldUpdate();
	}
	/*
	 * @return the buffer
	 */
	public String getBuffer() {
		return buffer;
	}
}
